package com.winner;

import com.winner.service.UserService;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * https://blog.csdn.net/Youth_lql/article/details/122728323
 *
 * https://blog.csdn.net/ethan_199402/article/details/109602911
 *
 * https://blog.csdn.net/aaa_bbb_ccc_123_456/article/details/103857758
 */
public class Main {

	public static void main(String[] args) {
        // 如果是用 Spring Boot，一般是 AnnotationConfigApplicationContext，最终都会继承 AbstractApplicationContext，核心逻辑也都是在 AbstractApplicationContext 中实现。
		// ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");  // 最终都是调用refresh()方法
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 点进去也是调用了父类AbstractApplicationContext的 refresh()方法  AnnotatedGenericBeanDefinition
		String[] beanDefinitionNames = context.getBeanDefinitionNames();
		System.out.println("----------------------------");
		System.out.println("打印容器中所有的beanDefinitionNames");
		Arrays.stream(beanDefinitionNames).forEach(a -> System.out.println(a));

		BeanDefinition beanDefinition = context.getBeanDefinition("userServiceImpl");
//		Generic bean: class [com.winner.service.UserServiceImpl];
//		scope=singleton; abstract=false;
//		lazyInit=null;
//		autowireMode=0;
//		dependencyCheck=0;
//		autowireCandidate=true;
//		primary=false;
//		factoryBeanName=null;
//		factoryMethodName=null;
//		initMethodName=null;
//		destroyMethodName=null;
//		defined in file [D:\code\spring-framework\sino\build\classes\java\main\com\winner\service\UserServiceImpl.class]

		// 注意， 注入到spring容器中的是一个类， 而不是接口， 所以这里需要用userServiceImpl作为名称, 以下2种写法都可以
		UserService bean = context.getBean(UserService.class);
		UserService userService = context.getBean("userServiceImpl", UserService.class);
		userService.test();
	}
}
